package com.pe.pgn.clubpgn.dao.impl;

import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.sql.DataSource;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.dao.TransferenciaDao;
import com.pe.pgn.clubpgn.dao.hibernate.GenericDaoHibernate;
import com.pe.pgn.clubpgn.domain.ClpbAlmacen;
import com.pe.pgn.clubpgn.domain.ClpbDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpdArticulo;
import com.pe.pgn.clubpgn.domain.ClpdDocumentoMovArticulo;
import com.pe.pgn.clubpgn.domain.ClpmCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmStockAlmacenCatalogo;
import com.pe.pgn.clubpgn.domain.ClpmTransaccionArticulo;
import com.pe.pgn.clubpgn.domain.ClprPremioCatalogo;
import com.pe.pgn.clubpgn.domain.beans.BNAlmacen;
import com.pe.pgn.clubpgn.domain.beans.BNArticulo;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoDetalle;
import com.pe.pgn.clubpgn.domain.beans.BNDocumentoMovArticulo;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

/**
 * @author Frank
 * */

@Repository("transferenciaDao")
public class TransferenciaDaoImpl extends GenericDaoHibernate<ClpbDocumentoMovArticulo, Long> implements TransferenciaDao{

	private JdbcTemplate jdbcTemplate;
	
	@Autowired
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	public TransferenciaDaoImpl() {
		super(ClpbDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> obtenerListaTransferencias() {

		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select * from (");
		
		query.append(" select ");
		query.append(" 	dma.id, ");
		query.append(" 	"+strFechaDoc+"	 as daFechaDocumento, ");
		query.append(" 	dma.de_documento as deDocumento ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" where dma.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dma.st_indicador_tipo_documento = '").append(CLPConstantes.ST_DOCUMENTO_TRANSFERENCIA).append("'");
		
		query.append(" order by dma.id desc ");
		query.append(" ) where rownum <= ").append(CLPConstantes.MAXIMO_RESULTADO_INICIAL);
		
		System.out.println("TransferenciaDaoImpl.obtenerListaTransferencias() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNAlmacen> obtenerTodosAlmacenes() {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	id, ");
		query.append(" 	de_almacen			    as deAlmacen, ");
		query.append(" 	st_es_punto_canje	    as stEsPuntoCanje, ");
		query.append(" 	st_es_almacen_virtual   as stEsAlmacenVirtual,  ");
		query.append(" 	st_es_almacen_principal as stEsAlmacenPrincipal ");
		query.append(" from clpb_almacen ");
		query.append(" where st_almacen = '").append(CLPConstantes.ST_VERDADERO).append("'");
		return findListOfBeans(query.toString(), null, BNAlmacen.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNDocumentoMovArticulo> busquedaListaTransferencias(
	String daFinDoc, String daInicioDoc, String deDocumento) {

		try{
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daInicioDoc);
        	CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, daFinDoc);
        }catch(Exception e){
        	//entra aca si el parametro dado no es una fecha
        	daInicioDoc = "";
        	daFinDoc 	= "";
        }
		
        String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		dma.id, ");
		query.append(" 		"+strFechaDoc+"		as daFechaDocumento, ");
		query.append(" 		dma.de_documento	as deDocumento ");
		
		query.append(" from clpb_documento_mov_articulo dma ");
		query.append(" where dma.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dma.st_indicador_tipo_documento = '").append(CLPConstantes.ST_DOCUMENTO_TRANSFERENCIA).append("'");
		
		if (StringUtils.isNotBlank(daInicioDoc) && StringUtils.isNotBlank(daFinDoc)){
			query.append(" and (dma.da_fecha_documento >= to_date('"+daInicioDoc+"'," +
			"'"+CLPConstantes.DATE_PATTERN+"') and dma.da_fecha_documento <= to_date('"+daFinDoc+"','"+CLPConstantes.DATE_PATTERN+"'))");
		}
		
		if(StringUtils.isNotBlank(deDocumento))
		query.append(" and upper(trim(dma.de_documento)) like upper('%").append(deDocumento.trim()).append("%')");		
		query.append(" order by dma.id desc ");
		
		System.out.println("TransferenciaDaoImpl.busquedaListaTransferencias() --> "+query.toString());
		return findListOfBeans(query.toString(), null, BNDocumentoMovArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public BNDocumentoMovArticulo obtenerDocumentoTransferencia(Long id) {

		String strFechaDoc = "to_char(cast(" +
		"dma.da_fecha_documento as date),  " +
		"'"+CLPConstantes.DATE_PATTERN+"')";
		
		StringBuffer query = new StringBuffer();		
		query.append(" select ");
		query.append(" 	dma.id, ");
		query.append(" 	"+strFechaDoc+"	  as daFechaDocumento,");
		query.append(" 	dma.de_documento  as deDocumento ");		
		query.append(" from clpb_documento_mov_articulo dma ");		
		query.append(" where dma.id = ").append(id);
		query.append(" 		and dma.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and dma.st_indicador_tipo_documento = '").append(CLPConstantes.ST_DOCUMENTO_TRANSFERENCIA).append("'");
		
		System.out.println("Obteniendo BASE: "+query.toString());
		List<BNDocumentoMovArticulo> list = findListOfBeans
		(query.toString(), null, BNDocumentoMovArticulo.class);
		
		if(!list.isEmpty()){
			
			BNDocumentoMovArticulo bndocumento = 
			(BNDocumentoMovArticulo)list.get(0);
			
			query = new StringBuffer();
			query.append(" select ");
			query.append(" 	dta.co_articulo 		as coArticulo, ");
			query.append(" 	art.de_articulo 		as deArticulo, ");
			query.append(" 	unm.de_unidad_medida	as deUnidadMedida,    ");
			query.append(" 	art.co_codigo_articulo	as coCodigoArticulo,  ");
			query.append(" 	dta.va_cantidad 		as vaCantidad,		  ");
			query.append(" 	dta.co_almacen_origen	as coAlmacenOrigen,   ");
			query.append(" 	dta.co_catalogo_origen  as coCatalogoOrigen,  ");			
			query.append(" 	dta.co_almacen_destino	as coAlmacenDestino,  ");
			query.append(" 	dta.co_catalogo_destino as coCatalogoDestino, ");
			
			query.append(" 	almo.de_almacen			as deAlmacenOrigen,   ");
			query.append(" 	cato.de_catalogo		as deCatalogoOrigen,  ");
			query.append(" 	almd.de_almacen			as deAlmacenDestino,  ");
			query.append(" 	catd.de_catalogo		as deCatalogoDestino, ");
			query.append(" 	dta.co_premio_destino 	as coPremioDestino  , ");
			query.append(" 	prc.co_codigo_premio 	as dePremioDestino    ");
			
			query.append(" from clpd_documento_mov_articulo dta ");
			query.append(" inner join clpd_articulo art ");
			query.append(" 		on art.id = dta.co_articulo ");
			query.append(" inner join clpd_unidad_medida unm ");
			query.append(" 		on unm.id = art.co_unidad_medida ");			
			query.append(" inner join clpb_almacen almo ");
			query.append(" 		on almo.id = dta.co_almacen_origen ");
			query.append(" left join clpm_catalogo cato ");
			query.append(" 		on cato.id = dta.co_catalogo_origen ");			
			query.append(" inner join clpb_almacen almd ");
			query.append(" 		on almd.id = dta.co_almacen_destino ");
			query.append(" left join clpm_catalogo catd ");
			query.append(" 		on catd.id = dta.co_catalogo_destino ");
			query.append(" left join clpr_premio_catalogo prc ");
			query.append(" 		on prc.id = dta.co_premio_destino ");
			
			query.append(" where dta.co_documento_mov_articulo = ").append(id);
			query.append(" 	and dta.st_documento_mov_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
			
			System.out.println("Obteniendo DETALLE: "+query.toString());
			List<BNDocumentoDetalle> listDetalle = findListOfBeans
			(query.toString(), null, BNDocumentoDetalle.class);
			
			if(!listDetalle.isEmpty())
			bndocumento.setDocumentoDetalle(listDetalle);			
			
			return bndocumento;
		}
		
		return new BNDocumentoMovArticulo();
	}

	@SuppressWarnings("unchecked")
	public List<BNArticulo> obtenerListaArticulosWizard(
		String coAlmacenOrigen, String coAlmacenDestino, 
		String coCatalogoOrigen, String coCatalogoDestino) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	csa.co_premio		    as coPremio, ");
		query.append(" 	csa.co_articulo		    as coArticulo, ");
		query.append(" 	art.de_articulo		    as deArticulo, ");
		query.append(" 	cat.de_categoria	    as deCategoria, ");
		query.append(" 	und.de_unidad_medida    as deUnidadMedida, ");
		query.append(" 	prc.co_codigo_premio    as coCodigoPremio, ");
		query.append(" 	art.co_codigo_articulo  as coCodigoArticulo, ");
		query.append(" 	art.st_no_maneja_stock  as stNoManejaStock,  ");
		query.append(" 	art.st_maneja_stock_punto_canje	  as stManejaStockPuntoCanje,  ");
		query.append(" 	art.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
		query.append(" 	art.st_instantaneo_normal as stInstantaneoNormal, ");
		query.append(" 	art.st_instantaneo_vale as stInstantaneoVale, ");
		query.append(" 	csa.va_cantidad  as vaStockOrigen,  ");
		query.append(" 	cdes.va_cantidad as vaStockDestino ");
		
		query.append(" from clpm_stock_almacen_catalogo csa ");
		query.append(" inner join clpd_articulo art ");
		query.append(" 		on art.id = csa.co_articulo ");
		query.append(" inner join clpd_unidad_medida und ");
		query.append(" 		on und.id = art.co_unidad_medida ");
		query.append(" inner join clpb_categoria cat ");
		query.append(" 		on cat.id = art.co_categoria ");
		query.append(" left join clpr_premio_catalogo prc ");
		query.append(" 		on prc.id = csa.co_premio ");
		query.append(" left outer join clpm_stock_almacen_catalogo cdes ");
		query.append(" 		on cdes.co_almacen = ").append(coAlmacenDestino);
		
		if(StringUtils.isBlank(coCatalogoDestino) || "-1".equals(coCatalogoDestino)){
			query.append(" and cdes.co_catalogo is null and cdes.co_premio is null");
			query.append(" and cdes.co_articulo = csa.co_articulo ");
		}else{
			query.append(" and cdes.co_catalogo = ").append(coCatalogoDestino);
			query.append(" and cdes.co_articulo = csa.co_articulo ");
			query.append(" and cdes.co_premio   = csa.co_premio ");
		}
		
		query.append(" where csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and csa.co_almacen = ").append(coAlmacenOrigen);
		query.append(" 		and art.st_instantaneo_vale = '").append(CLPConstantes.ST_FALSO).append("'");
		
		if(StringUtils.isBlank(coCatalogoOrigen) || "-1".equals(coCatalogoOrigen)){
			query.append(" and csa.co_catalogo is null and csa.co_premio is null");
		}else{
			query.append(" and csa.co_catalogo = ").append(coCatalogoOrigen);
		}
		
		System.out.println("TransferenciaDaoImpl.obtenerListaArticulosWizard() -->"+query.toString());
		return findListOfBeans(query.toString(), null, BNArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public List<BNArticulo> buscarListaArticulosWizard(String coCategoria,
	String deArticulo, String coCodigo, String stManejaStock,
	String stManejaSerie, String coAlmacenOrigen, String coAlmacenDestino, 
	String coCatalogoOrigen, String coCatalogoDestino) {
		
		if(StringUtils.isBlank(coCatalogoOrigen)){
			coCatalogoOrigen="-1";
		}
			
		if(StringUtils.isBlank(coCatalogoDestino)){
			coCatalogoDestino="-1";
		}
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	csa.co_premio		    as coPremio, ");
		query.append(" 	csa.co_articulo		    as coArticulo, ");
		query.append(" 	art.de_articulo		    as deArticulo, ");
		query.append(" 	cat.de_categoria	    as deCategoria, ");
		query.append(" 	und.de_unidad_medida    as deUnidadMedida, ");
		query.append(" 	prc.co_codigo_premio    as coCodigoPremio, ");		
		query.append(" 	art.co_codigo_articulo  as coCodigoArticulo, ");
		query.append(" 	art.st_no_maneja_stock  as stNoManejaStock, ");
		query.append(" 	art.st_maneja_stock_punto_canje	  as stManejaStockPuntoCanje,  ");
		query.append(" 	art.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
		query.append(" 	art.st_instantaneo_normal as stInstantaneoNormal, ");
		query.append(" 	art.st_instantaneo_vale as stInstantaneoVale, ");
		query.append(" 	csa.va_cantidad  as vaStockOrigen,  ");
		query.append(" 	cdes.va_cantidad as vaStockDestino ");
		
		query.append(" from clpm_stock_almacen_catalogo csa ");
		query.append(" inner join clpd_articulo art ");
		query.append(" 		on art.id = csa.co_articulo ");
		query.append(" inner join clpd_unidad_medida und ");
		query.append(" 		on und.id = art.co_unidad_medida ");
		query.append(" inner join clpb_categoria cat ");
		query.append(" 		on cat.id = art.co_categoria ");
		query.append(" left join clpr_premio_catalogo prc ");
		query.append(" 		on prc.id = csa.co_premio ");
		query.append(" left outer join clpm_stock_almacen_catalogo cdes ");
		query.append(" 		on cdes.co_almacen = ").append(coAlmacenDestino);
		
		if(StringUtils.isBlank(coCatalogoDestino) || "-1".equals(coCatalogoDestino)){
			query.append(" and cdes.co_catalogo is null and cdes.co_premio is null");
			query.append(" and cdes.co_articulo = csa.co_articulo ");
		}else{
			query.append(" and cdes.co_catalogo = ").append(coCatalogoDestino);
			query.append(" and cdes.co_articulo = csa.co_articulo ");
			query.append(" and cdes.co_premio   = csa.co_premio ");
		}
		
		query.append(" where csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 		and csa.co_almacen = ").append(coAlmacenOrigen);
		query.append(" 		and art.st_instantaneo_vale = '").append(CLPConstantes.ST_FALSO).append("'");
		
		if(StringUtils.isBlank(coCatalogoOrigen) || "-1".equals(coCatalogoOrigen)){
			query.append(" and csa.co_catalogo is null and csa.co_premio is null");
		}else{
			query.append(" and csa.co_catalogo = ").append(coCatalogoOrigen);
		}
		
		/////////////////////////////////////////////////////////////////////
		
		if (StringUtils.isNotBlank(coCategoria) && !"-1".equals(coCategoria)){
			query.append(" 	and art.co_categoria = ").append(coCategoria);
		}
		
		if (StringUtils.isNotBlank(deArticulo)){
			query.append(" 	and upper(art.de_articulo) like upper(").append("'%"+deArticulo+"%')");
		}
		
		if(StringUtils.isBlank(coCatalogoOrigen) || "-1".equals(coCatalogoOrigen)){
			if (StringUtils.isNotBlank(coCodigo)){
				query.append(" 	and upper(art.co_codigo_articulo) like upper(").append("'%"+coCodigo+"%')");
			}
		}else{
			if (StringUtils.isNotBlank(coCodigo)){
				query.append(" 	and upper(prc.co_codigo_premio) like upper(").append("'%"+coCodigo+"%')");
			}
		}
		
		if(StringUtils.isNotBlank(stManejaStock) && !stManejaStock.equalsIgnoreCase("-1")){
			
			if(stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_PUNTO_CANJE)){
				query.append("	and art.st_maneja_stock_punto_canje = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_MANEJA_STOCK_ALMACEN_PRINCIPAL)){
				query.append("	and art.st_maneja_stock_alm_principal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_NO_MANEJA_STOCK)){
				query.append("	and art.st_no_maneja_stock = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
			else if (stManejaStock.equalsIgnoreCase(CLPConstantes.ST_PREMIO_INSTANTANEO_NORMAL)){
				query.append("	and art.st_instantaneo_normal = '").append(CLPConstantes.ST_VERDADERO).append("'");
			}
		}
		
		if(StringUtils.isNotBlank(stManejaSerie) && !stManejaSerie.equalsIgnoreCase("-1")){
			query.append("	and art.st_maneja_serie = '").append(stManejaSerie).append("'");			
		}
		
		System.out.println("TransferenciaDaoImpl.buscarListaArticulosWizard() -->"+query.toString());
		return findListOfBeans(query.toString(), null, BNArticulo.class);
	}

	@SuppressWarnings("unchecked")
	public BNArticulo obtenerDatosArticuloPorCodigo(String coCodigo,
			String coAlmacenOrigen,	String coCatalogoOrigen) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 	csa.co_premio		    as coPremio, ");
		query.append(" 	csa.co_articulo		    as coArticulo, ");
		query.append(" 	art.de_articulo		    as deArticulo, ");
		query.append(" 	und.de_unidad_medida    as deUnidadMedida, ");
		query.append(" 	art.co_codigo_articulo  as coCodigoArticulo, ");
		query.append(" 	csa.va_cantidad  		as vaStockOrigen,  ");
		query.append(" 	art.st_no_maneja_stock  as stNoManejaStock, ");
		query.append(" 	art.st_maneja_stock_punto_canje	  as stManejaStockPuntoCanje,  ");
		query.append(" 	art.st_maneja_stock_alm_principal as stManejaStockAlmPrincipal, ");
		query.append(" 	art.st_instantaneo_normal 	as stInstantaneoNormal, ");
		query.append(" 	art.st_instantaneo_vale 	as stInstantaneoVale ");
		
		query.append(" from clpm_stock_almacen_catalogo csa ");
		query.append(" inner join clpd_articulo art ");
		query.append(" 		on art.id = csa.co_articulo ");
		query.append(" inner join clpd_unidad_medida und ");
		query.append(" 		on und.id = art.co_unidad_medida ");
		query.append(" left join clpr_premio_catalogo prc ");
		query.append(" 		on prc.id = csa.co_premio ");
		query.append(" where csa.co_almacen = ").append(coAlmacenOrigen);
		query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" 	and art.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");	
		
		if(StringUtils.isBlank(coCatalogoOrigen) || "-1".equals(coCatalogoOrigen)){
			query.append(" and art.co_codigo_articulo = '").append(coCodigo).append("'");
			query.append(" and csa.co_catalogo is null and csa.co_premio is null");
		}else{
			query.append(" and prc.co_codigo_premio = '").append(coCodigo).append("'");
			query.append(" and csa.co_catalogo = ").append(coCatalogoOrigen);
		}
		
		System.out.println("TransferenciaDaoImpl.obtenerDatosArticuloPorCodigo() -->"+query.toString());
		List<BNArticulo> list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){
			return list.get(0);
		}
		
		return new BNArticulo();
	}
	
	@SuppressWarnings("unchecked")
	public BNAlmacen obtenerDatosAlmacenPorCodigo(String coAlmacen) {

		StringBuffer query = new StringBuffer();
		query.append(" select ");
		query.append(" 		de_almacen			    as deAlmacen, ");
		query.append(" 		st_es_punto_canje	    as stEsPuntoCanje, ");
		query.append(" 		st_es_almacen_virtual   as stEsAlmacenVirtual,  ");
		query.append(" 		st_es_almacen_principal as stEsAlmacenPrincipal ");
		query.append(" from clpb_almacen ");
		query.append(" where id = ").append(coAlmacen);
		
		System.out.println("IngresoArticuloDaoImpl.obtenerDatosAlmacenPorCodigo() "+query.toString());
		List<BNAlmacen> list = findListOfBeans(query.toString(), null, BNAlmacen.class);
		
		if(!list.isEmpty()){
			return (BNAlmacen)list.get(0);
		}else{
			return new BNAlmacen();
		}
	}
	
	@SuppressWarnings("unchecked")
	public List<BNArticulo> obtenerPremiosPorArticulo(String coAlmacenOrigen,
	String coCatalogoOrigen, String coCatalogoDestino, String coCodigoArticulo) {

		StringBuffer query = new StringBuffer();
		query.append(" select  ");
		query.append(" 	pc.id, ");
		query.append(" 	pc.co_codigo_premio||' - '||art.de_articulo as dePremio ");
		query.append(" from clpr_premio_catalogo pc ");
		query.append(" inner join clpd_articulo art ");
		query.append(" 	on art.id = pc.co_premio ");
		query.append(" where pc.co_catalogo = ").append(coCatalogoDestino);
		query.append(" and pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and art.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		
		if(StringUtils.isBlank(coCatalogoOrigen) || "-1".equals(coCatalogoOrigen)){
			query.append(" and art.co_codigo_articulo = '").append(coCodigoArticulo).append("'");
		}else{
			query.append(" and pc.co_codigo_premio = '").append(coCodigoArticulo).append("'");
		}
		
		System.out.println("obtenerPremiosPorArticulo() -->"+query.toString());
		List list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){
			return list;
		}else{
			
			BNArticulo bean = new BNArticulo();
			bean.setId(new Long("-1"));
			bean.setDePremio("----");
			
			List listOther = new ArrayList();
			listOther.add(bean);
			return listOther;			
		}
	}
	
	@SuppressWarnings("unchecked")
	public Map guardarDocumentoTransferencia(
			BNDocumentoMovArticulo bntransf) throws SQLException{

		Map mapTesteo   = new HashMap();
		Map mapMaestro  = new HashMap();
		Map mapPremio   = new HashMap();
		Map mapArticulo = new HashMap();
		Map mapGost		= new HashMap();
		Map map = new HashMap();
		
		try{ 
			
			List<BNDocumentoDetalle> listDtl = 
			bntransf.getDocumentoDetalle();
			
			if(!listDtl.isEmpty()){
				for (BNDocumentoDetalle beandetalle : listDtl) {
					if (StringUtils.isNotBlank(beandetalle.getCoArticulo())){
						
						Long coCatalogoOrigen  = null;
						Long coCatalogoDestino = null;
						Long coPremioDestino   = null;
						Long coPremioOrigen    = null;
						Long coAlmacenDestino  = new Long(beandetalle.getCoAlmacenDestino());
						Long coAlmacenOrigen   = new Long(beandetalle.getCoAlmacenOrigen());
						Long coArticulo 	   = new Long(beandetalle.getCoArticulo());
						BigDecimal cantidad    = new BigDecimal(beandetalle.getVaCantidad());
						
						if (StringUtils.isNotBlank(beandetalle.getCoCatalogoDestino()) && 
							!beandetalle.getCoCatalogoDestino().equals("-1")){
							coCatalogoDestino = new Long(beandetalle.getCoCatalogoDestino());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoCatalogoOrigen()) &&
							!beandetalle.getCoCatalogoOrigen().equals("-1")){
							coCatalogoOrigen = new Long(beandetalle.getCoCatalogoOrigen());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoPremio())){
							coPremioOrigen = new Long(beandetalle.getCoPremio());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoPremioDestino())){
							coPremioDestino = new Long(beandetalle.getCoPremioDestino());
						}
						

						/**
						 * ************************************
						 * Cuando El catalogo Origen esta vacio
						 * ************************************
						 * */

						if(coCatalogoOrigen == null){
							if(mapMaestro.get(coAlmacenOrigen+"-"+coArticulo) == null){
								
								StringBuffer query = new StringBuffer();
								query.append(" select ");
								query.append(" 		csa.va_cantidad, ");
								query.append(" 		art.va_stock_disponible ");
								query.append(" from clpm_stock_almacen_catalogo csa ");
								query.append(" join clpd_articulo art ");
								query.append(" 	on art.id = csa.co_articulo ");
								query.append(" where csa.co_articulo = ").append(coArticulo);
								query.append(" 	and csa.co_almacen  = ").append(coAlmacenOrigen);
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								query.append("  and csa.co_catalogo is null and csa.co_premio is null");
								
								List listOrigen = findListOfMaps(query.toString(), null);
								Map mapOrigen   = (HashMap)listOrigen.get(0);
								
								if(mapArticulo.get(coArticulo) == null){
									mapArticulo.put(coArticulo, String.valueOf
									(mapOrigen.get("va_stock_disponible")));
								}
								
								Long cantidadOrigen = new Long(mapOrigen.get("va_cantidad").toString());
								mapMaestro.put(coAlmacenOrigen+"-"+coArticulo, new Long(mapOrigen.get("va_cantidad").toString()));
								mapTesteo.put(coAlmacenOrigen+"-"+coArticulo , new Long(mapOrigen.get("va_cantidad").toString()));
								
								cantidadOrigen = cantidadOrigen - cantidad.longValue();							
								mapTesteo.put(coAlmacenOrigen+"-"+coArticulo, cantidadOrigen);
								
								if(cantidadOrigen < 0){
									map.put("msg"	 , "error");
									map.put("detalle", "vaCantidad");
									map.put("flag"	 , beandetalle.getDeArticulo());
									
									getHibernateTemplate().clear();
									return (HashMap)map;
								}
							}else{
								
								String strCantidadOrigen = String.valueOf(mapTesteo.
								get(coAlmacenOrigen+"-"+coArticulo));
								
								Long cantidadOrigen = new Long(strCantidadOrigen);
								cantidadOrigen = cantidadOrigen - cantidad.longValue();							
								mapTesteo.put(coAlmacenOrigen+"-"+coArticulo, cantidadOrigen);
								
								if(cantidadOrigen < 0){
									map.put("msg"	 , "error");
									map.put("detalle", "vaCantidad");
									map.put("flag"	 , beandetalle.getDeArticulo());
									
									getHibernateTemplate().clear();
									return (HashMap)map;
								}
							}
						}else{
							
							/**
							 * ************************************
							 * Cuando El catalogo Origen esta lleno
							 * ************************************
							 * */
							
							if(mapMaestro.get(coAlmacenOrigen+"-"+coCatalogoOrigen+"-"+
							   coArticulo+"-"+coPremioOrigen) == null){
								
								StringBuffer query = new StringBuffer();
								query.append(" select ");
								query.append(" 		csa.va_cantidad, ");
								query.append(" 		csa.va_stock_catalogo, ");
								query.append(" 		csa.va_stock_catalogo_espejo, ");
								query.append(" 		prc.va_stock_catalogo as va_stock_catalogo_premio, ");
								query.append(" 		prc.va_stock_catalogo_espejo as va_stock_catalogo_espejo_prem ");
								query.append(" from clpm_stock_almacen_catalogo csa ");
								query.append(" join clpr_premio_catalogo prc ");
								query.append(" 	on  prc.id 		    = csa.co_premio ");
								query.append(" 	and prc.co_premio   = csa.co_articulo ");
								query.append(" 	and prc.co_catalogo = csa.co_catalogo ");
								query.append(" where csa.co_articulo = ").append(coArticulo);
								query.append(" 	and csa.co_catalogo = ").append(coCatalogoOrigen);
								query.append(" 	and csa.co_almacen  = ").append(coAlmacenOrigen);
								query.append(" 	and csa.co_premio   = ").append(coPremioOrigen);
								query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								
								List listOrigen = findListOfMaps(query.toString(), null);
								Map mapOrigen   = (HashMap)listOrigen.get(0);
								mapMaestro.put(coAlmacenOrigen+"-"+coCatalogoOrigen+"-"+coArticulo+"-"+coPremioOrigen, mapOrigen);
								mapTesteo.put(coAlmacenOrigen+"-"+coCatalogoOrigen+"-"+coArticulo+"-"+coPremioOrigen, mapOrigen);
								
								Long cantidadOrigen = new Long(mapOrigen.get("va_cantidad").toString());
								cantidadOrigen = cantidadOrigen - cantidad.longValue();
								
								Map mapSubOrigen = new HashMap();
								mapSubOrigen.put("va_cantidad", cantidadOrigen);
								mapSubOrigen.put("va_stock_catalogo", mapOrigen.get("va_stock_catalogo"));
								mapSubOrigen.put("va_stock_catalogo_espejo", mapOrigen.get("va_stock_catalogo_espejo"));
								mapSubOrigen.put("va_stock_catalogo_premio", mapOrigen.get("va_stock_catalogo_premio"));
								mapSubOrigen.put("va_stock_catalogo_espejo_prem", mapOrigen.get("va_stock_catalogo_espejo_prem"));
								
								mapTesteo.put(coAlmacenOrigen+"-"+coCatalogoOrigen+"-"+
								coArticulo+"-"+coPremioOrigen, mapSubOrigen);
								
								if(mapPremio.get(coPremioOrigen+"-"+coArticulo+"-"+coCatalogoOrigen) == null){
								   mapPremio.put(coPremioOrigen+"-"+coArticulo+"-"+coCatalogoOrigen, mapSubOrigen);
								}
								
								if(cantidadOrigen < 0){
									map.put("msg"	 , "error");
									map.put("detalle", "vaCantidad");
									map.put("flag"	 , beandetalle.getDeArticulo());
									
									getHibernateTemplate().clear();
									return (HashMap)map;
								}		
								
							}else{
								
								Map mapOrigen = (HashMap)mapTesteo.get(coAlmacenOrigen+
								"-"+coCatalogoOrigen+"-"+coArticulo+"-"+coPremioOrigen);
								
								String strCantidadOrigen = String.valueOf
								(mapOrigen.get("va_cantidad"));
								
								Long cantidadOrigen = new Long(strCantidadOrigen);
								cantidadOrigen = cantidadOrigen - cantidad.longValue();							
								
								mapOrigen.put("va_cantidad", cantidadOrigen);
								mapTesteo.put(coAlmacenOrigen+"-"+coCatalogoOrigen+
								"-"+coArticulo+"-"+coPremioOrigen, mapOrigen);
								
								if(cantidadOrigen < 0){
									map.put("msg"	 , "error");
									map.put("detalle", "vaCantidad");
									map.put("flag"	 , beandetalle.getDeArticulo());
									
									getHibernateTemplate().clear();
									return (HashMap)map;
								}
							}
						}
						
						/**
						 * ************************************
						 * Cuando El catalogo Destino esta vacio
						 * ************************************
						 * */
						
						if(coCatalogoDestino == null){
							if(mapMaestro.get(coAlmacenDestino+"-"+coArticulo) == null){
								
								StringBuffer query = new StringBuffer();
								query.append(" select ");
								query.append(" 		csa.va_cantidad, ");
								query.append(" 		art.va_stock_disponible ");
								query.append(" from clpm_stock_almacen_catalogo csa ");
								query.append(" join clpd_articulo art ");
								query.append(" 	on art.id = csa.co_articulo ");
								query.append(" where csa.co_almacen  = ").append(coAlmacenDestino);
								query.append("  and csa.co_articulo = ").append(coArticulo);
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								query.append("  and csa.co_catalogo is null and csa.co_premio is null");
								
								List listDestino = findListOfMaps(query.toString(), null);
								if(!listDestino.isEmpty()){
									
									Map mapDestino = (HashMap)listDestino.get(0);
									Long cantidadDestino = new Long(mapDestino.get("va_cantidad").toString());
									mapMaestro.put(coAlmacenDestino+"-"+coArticulo, cantidadDestino);
									mapTesteo.put(coAlmacenDestino+"-"+coArticulo, cantidadDestino);
									
									if(mapArticulo.get(coArticulo) == null){
										mapArticulo.put(coArticulo, String.valueOf
										(mapDestino.get("va_stock_disponible")));
									}
									
								}else{
									
									mapMaestro.put(coAlmacenDestino+"-"+coArticulo, "null");
									mapTesteo.put(coAlmacenDestino+"-"+coArticulo, "null");
									
									query = new StringBuffer();
									query.append(" select ");
									query.append(" 		art.id,art.va_stock_disponible ");
									query.append(" from clpd_articulo art ");
									query.append(" where art.id = ").append(coArticulo);
									
									List listArt = findListOfMaps(query.toString(), null);
									if(!listArt.isEmpty()){
										Map mapArt = (HashMap)listArt.get(0);
										if(mapArticulo.get(coArticulo) == null){
											mapArticulo.put(coArticulo, String.valueOf
											(mapArt.get("va_stock_disponible")));
										}										
									}									
								}
							}						
						}else{
							
							/**
							 * *************************************
							 * Cuando El catalogo Destino esta lleno
							 * *************************************
							 * */
							
							if(mapMaestro.get(coAlmacenDestino+"-"+coCatalogoDestino
							   +"-"+coArticulo+"-"+coPremioDestino) == null){
								
								StringBuffer query = new StringBuffer();
								query.append(" select ");
								query.append(" 		csa.va_cantidad, ");
								query.append(" 		csa.va_stock_catalogo, ");
								query.append(" 		csa.va_stock_catalogo_espejo, ");
								query.append(" 		prc.va_stock_catalogo as va_stock_catalogo_premio, ");
								query.append(" 		prc.va_stock_catalogo_espejo as va_stock_catalogo_espejo_prem ");
								query.append(" from clpm_stock_almacen_catalogo csa ");
								query.append(" join clpr_premio_catalogo prc ");
								query.append(" 	on  prc.id 		    = csa.co_premio ");
								query.append(" 	and prc.co_premio   = csa.co_articulo ");
								query.append(" 	and prc.co_catalogo = csa.co_catalogo ");
								query.append(" where csa.co_catalogo = ").append(coCatalogoDestino);
								query.append(" 	and csa.co_almacen  = ").append(coAlmacenDestino);
								query.append("  and csa.co_articulo = ").append(coArticulo);
								query.append("  and csa.co_premio   = ").append(coPremioDestino);
								query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								
								List listDestino = findListOfMaps(query.toString(), null);
								if(!listDestino.isEmpty()){
									
									Map mapDestino = (HashMap)listDestino.get(0);
									mapMaestro.put(coAlmacenDestino+"-"+coCatalogoDestino+"-"+coArticulo+"-"+coPremioDestino, mapDestino);
									mapTesteo.put(coAlmacenDestino+"-"+coCatalogoDestino+"-"+coArticulo+"-"+coPremioDestino, mapDestino);
									
									if(mapPremio.get(coPremioDestino+"-"+coArticulo+"-"+coCatalogoDestino) == null){
									   mapPremio.put(coPremioDestino+"-"+coArticulo+"-"+coCatalogoDestino, mapDestino);
									}
									
								}else{
									mapMaestro.put(coAlmacenDestino+"-"+coCatalogoDestino+"-"+coArticulo+"-"+coPremioDestino, new HashMap());
									mapTesteo.put( coAlmacenDestino+"-"+coCatalogoDestino+"-"+coArticulo+"-"+coPremioDestino, new HashMap());
									
									if(mapPremio.get(coPremioDestino+"-"+coArticulo+"-"+coCatalogoDestino) == null){
										
										query = new StringBuffer();
										query.append(" select ");
										query.append(" 	prc.va_stock_catalogo as va_stock_catalogo_premio, ");
										query.append(" 	prc.va_stock_catalogo_espejo as va_stock_catalogo_espejo_prem ");
										query.append(" from clpr_premio_catalogo prc ");
										query.append(" where prc.id 		    = ").append(coPremioDestino);
										query.append(" 	and prc.co_premio   = ").append(coArticulo);
										query.append(" 	and prc.co_catalogo = ").append(coCatalogoDestino);
										query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
										List listPremio = findListOfMaps(query.toString(), null);
										if(!listPremio.isEmpty()){
											
											Map mapDestino = (HashMap)listPremio.get(0);
											mapPremio.put(coPremioDestino+"-"+coArticulo+"-"+
											coCatalogoDestino, mapDestino);
											
										}else{
											mapPremio.put(coPremioDestino+"-"+coArticulo+"-"+
											coCatalogoDestino, new HashMap());
										}								  
									}
								}
							}
						}
					}
				}
			}
			
			/**
			 * **************************************************************
			 * **************************************************************
			 * **************************************************************
			 * */
			
			//BASE
			ClpbDocumentoMovArticulo objBean = new ClpbDocumentoMovArticulo();
			objBean.setDaFechaDocumento(Calendar.getInstance());
			objBean.setDeDocumento(bntransf.getDeDocumento());
			
			objBean.setStDocumentoMovArticulo(true);
			objBean.setStIndicadorTipoDocumento(CLPConstantes.ST_DOCUMENTO_TRANSFERENCIA);
			objBean.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
			objBean.setDaFechaCreacion(Calendar.getInstance());
			
			//guardando el registro base
			getHibernateTemplate().saveOrUpdate(objBean);
			
			//DETALLE
			if(!listDtl.isEmpty()){
				for (BNDocumentoDetalle beandetalle : listDtl) {
					if (StringUtils.isNotBlank(beandetalle.getCoArticulo())){
						
						Long coAlmacenOrigen   = null;
						Long coCatalogoOrigen  = null;
						Long coAlmacenDestino  = null;
						Long coCatalogoDestino = null;
						Long coPremioDestino   = null;
						ClprPremioCatalogo clprPremio = null;
						ClprPremioCatalogo clprPremioDestino = null;
						
						Long coArticulo = new Long
						(beandetalle.getCoArticulo());
						
						ClpdArticulo clpdArticulo = new ClpdArticulo();
						clpdArticulo.setId(coArticulo);
						
						if (StringUtils.isNotBlank(beandetalle.getCoPremio())){
							clprPremio = new ClprPremioCatalogo();
							clprPremio.setId(new Long(beandetalle.getCoPremio()));
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoPremioDestino())){
							clprPremioDestino = new ClprPremioCatalogo();
							clprPremioDestino.setId(new Long(beandetalle.getCoPremioDestino()));
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoAlmacenOrigen())){
							coAlmacenOrigen = new Long(beandetalle.getCoAlmacenOrigen());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoAlmacenDestino())){
							coAlmacenDestino = new Long(beandetalle.getCoAlmacenDestino());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoCatalogoOrigen()) &&
							!beandetalle.getCoCatalogoOrigen().equals("-1")){
							coCatalogoOrigen = new Long(beandetalle.getCoCatalogoOrigen());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoCatalogoDestino()) && 
							!beandetalle.getCoCatalogoDestino().equals("-1")){
							coCatalogoDestino = new Long(beandetalle.getCoCatalogoDestino());
						}
						
						if (StringUtils.isNotBlank(beandetalle.getCoPremioDestino()) && 
							!beandetalle.getCoPremioDestino().equals("-1")){
							coPremioDestino = new Long(beandetalle.getCoPremioDestino());
						}
						
						ClpbAlmacen clpbAlmacenOrigen = new ClpbAlmacen();
						clpbAlmacenOrigen.setId(coAlmacenOrigen);
						
						ClpbAlmacen clpbAlmacenDestino = new ClpbAlmacen();
						clpbAlmacenDestino.setId(coAlmacenDestino);
						
						BigDecimal cantidad = new BigDecimal(beandetalle.getVaCantidad());
						ClpdDocumentoMovArticulo objBeanDetalle = new ClpdDocumentoMovArticulo();
						objBeanDetalle.setClpbDocumento(objBean);
						objBeanDetalle.setClprPremio(clprPremio);
						objBeanDetalle.setClpdArticulo(clpdArticulo);
						objBeanDetalle.setCoAlmacenOrigen(coAlmacenOrigen);
						objBeanDetalle.setCoAlmacenDestino(coAlmacenDestino);
						objBeanDetalle.setCoCatalogoOrigen(coCatalogoOrigen);
						objBeanDetalle.setCoCatalogoDestino(coCatalogoDestino);
						objBeanDetalle.setCoPremioDestino(coPremioDestino);
						objBeanDetalle.setVaCantidad(cantidad);					
						objBeanDetalle.setStDocumentoMovArticulo(true);
						objBeanDetalle.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
						objBeanDetalle.setDaFechaCreacion(Calendar.getInstance());
						
						//guardando el registro detalle
						getHibernateTemplate().saveOrUpdate(objBeanDetalle);						
						////////////////////////////////////////////////////
						
						/*******************************
						 * Transferencia entre almacenes
						 * *****************************/
						
						if(coCatalogoOrigen == null && coCatalogoDestino == null){
							
							//Origen
							ClpmTransaccionArticulo clpmTransaccionOrigen = new ClpmTransaccionArticulo();
							clpmTransaccionOrigen.setClpdArticulo(clpdArticulo);
							clpmTransaccionOrigen.setCoCodigoArticulo(beandetalle.getCoCodigoArticulo());
							clpmTransaccionOrigen.setStIndicadorTipoMovimiento(CLPConstantes.TRANSFERENCIA_ENTRE_ALMACENES);
							
							clpmTransaccionOrigen.setVaCantidad(cantidad.negate());
							clpmTransaccionOrigen.setClpbAlmacen(clpbAlmacenOrigen);
							clpmTransaccionOrigen.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionOrigen.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionOrigen.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionOrigen);
							
							//Destino
							ClpmTransaccionArticulo clpmTransaccionDestino = new ClpmTransaccionArticulo();
							clpmTransaccionDestino.setClpdArticulo(clpdArticulo);
							clpmTransaccionDestino.setCoCodigoArticulo(beandetalle.getCoCodigoArticulo());
							clpmTransaccionDestino.setStIndicadorTipoMovimiento(CLPConstantes.TRANSFERENCIA_ENTRE_ALMACENES);
							
							clpmTransaccionDestino.setVaCantidad(cantidad);
							clpmTransaccionDestino.setClpbAlmacen(clpbAlmacenDestino);
							clpmTransaccionDestino.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionDestino.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionDestino.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionDestino);
							////////////////////////////////////////////////////////////
							
							//Actualizando stock almacen origen
							StringBuffer query = new StringBuffer();							
							String strCantidadOrigen = String.valueOf(mapMaestro.
							get(coAlmacenOrigen+"-"+coArticulo));
							
							Long cantidadOrigen = new Long(strCantidadOrigen);							
							cantidadOrigen = cantidadOrigen - cantidad.longValue();							
							mapMaestro.put(coAlmacenOrigen+"-"+coArticulo, cantidadOrigen);
							
							query = new StringBuffer();
							query.append(" update clpm_stock_almacen_catalogo csa ");
							query.append(" set ");
							query.append(" 		csa.va_cantidad = ").append(cantidadOrigen).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where csa.co_almacen = ").append(coAlmacenOrigen);
							query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
							query.append("  and csa.co_articulo = '").append(coArticulo).append("'");
							query.append("  and csa.co_catalogo is null and csa.co_premio is null");							
							jdbcTemplate.update(query.toString());
							//////////////////////////////////////
							
							//Actualizando stock almacen destino
							String strCantidadDestino = String.valueOf(mapMaestro.
							get(coAlmacenDestino+"-"+coArticulo));
							
							int rows = 0;
							if(!strCantidadDestino.equals("null")){
								
								Long cantidadDestino = new Long(strCantidadDestino);						
								cantidadDestino = cantidadDestino + cantidad.longValue();
								
								query = new StringBuffer();
								query.append(" update clpm_stock_almacen_catalogo csa ");
								query.append(" set ");
								query.append(" 		csa.va_cantidad = ").append(cantidadDestino).append(",");
								query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
								query.append(" 		da_fecha_modificacion  = sysdate");
								query.append(" where csa.co_almacen = ").append(coAlmacenDestino);
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								query.append("  and csa.co_articulo = '").append(coArticulo).append("'");
								query.append("  and csa.co_catalogo is null and csa.co_premio is null");							
								rows = jdbcTemplate.update(query.toString());
							}
							
							if(rows == 0){
								
								String strCantAlmacenada = String.valueOf(mapGost.get(
								coAlmacenDestino+"-"+coArticulo));
								
								if(strCantAlmacenada.equals("null")){
									mapGost.put(coAlmacenDestino+"-"+
									coArticulo,cantidad.longValue());
								}else{
									
									Long cantAlmacenada = new Long(strCantAlmacenada);
									cantAlmacenada = cantAlmacenada + cantidad.longValue();
									
									mapGost.put(coAlmacenDestino+"-"+
									coArticulo,cantAlmacenada);
								}								
							}
							
						/*******************************
						 * Transferencia entre catalogos
						 * *****************************/
							
						}else if(coCatalogoOrigen != null && coCatalogoDestino != null){
							
							Long coPremioOrigen = new Long(beandetalle.getCoPremio());
							ClpmCatalogo clpmCatalogoOrigen = new ClpmCatalogo();
							clpmCatalogoOrigen.setId(coCatalogoOrigen);
							
							ClpmCatalogo clpmCatalogoDestino = new ClpmCatalogo();
							clpmCatalogoDestino.setId(coCatalogoDestino);
							
							//Sacando de catalogo Origen
							ClpmTransaccionArticulo clpmTransaccionOne = new ClpmTransaccionArticulo();
							clpmTransaccionOne.setClpdArticulo(clpdArticulo);
							clpmTransaccionOne.setClprPremio(clprPremio);
							clpmTransaccionOne.setCoCodigoArticulo(beandetalle.getCoCodigoFlag());
							clpmTransaccionOne.setCoCodigoPremio(beandetalle.getCoCodigoArticulo());
							clpmTransaccionOne.setStIndicadorTipoMovimiento(CLPConstantes.TRANSFERENCIA_ENTRE_CATALOGOS);
							
							clpmTransaccionOne.setVaCantidad(cantidad.negate());
							clpmTransaccionOne.setClpbAlmacen(clpbAlmacenOrigen);
							clpmTransaccionOne.setClpmCatalogo(clpmCatalogoOrigen);
							clpmTransaccionOne.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionOne.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionOne.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionOne);
							
							//Metiendo a Almacen Origen
							ClpmTransaccionArticulo clpmTransaccionTwo = new ClpmTransaccionArticulo();
							clpmTransaccionTwo.setClpdArticulo(clpdArticulo);
							clpmTransaccionTwo.setCoCodigoArticulo(beandetalle.getCoCodigoFlag());
							clpmTransaccionTwo.setStIndicadorTipoMovimiento(CLPConstantes.TRANSFERENCIA_ENTRE_CATALOGOS);
							
							clpmTransaccionTwo.setVaCantidad(cantidad);
							clpmTransaccionTwo.setClpbAlmacen(clpbAlmacenOrigen);
							clpmTransaccionTwo.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionTwo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionTwo.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionTwo);
							
							//Sacando de Almacen Origen
							ClpmTransaccionArticulo clpmTransaccionThree = new ClpmTransaccionArticulo();
							clpmTransaccionThree.setClpdArticulo(clpdArticulo);
							clpmTransaccionThree.setCoCodigoArticulo(beandetalle.getCoCodigoFlag());
							clpmTransaccionThree.setStIndicadorTipoMovimiento(CLPConstantes.TRANSFERENCIA_ENTRE_CATALOGOS);
							
							clpmTransaccionThree.setVaCantidad(cantidad.negate());
							clpmTransaccionThree.setClpbAlmacen(clpbAlmacenOrigen);
							clpmTransaccionThree.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionThree.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionThree.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionThree);
							
							//Metiendo a Catalogo Destino
							ClpmTransaccionArticulo clpmTransaccionFourth = new ClpmTransaccionArticulo();
							clpmTransaccionFourth.setClpdArticulo(clpdArticulo);
							clpmTransaccionFourth.setClprPremio(clprPremioDestino);
							clpmTransaccionFourth.setCoCodigoArticulo(beandetalle.getCoCodigoFlag());
							clpmTransaccionFourth.setCoCodigoPremio(beandetalle.getDePremioDestino());
							clpmTransaccionFourth.setStIndicadorTipoMovimiento(CLPConstantes.TRANSFERENCIA_ENTRE_CATALOGOS);
							
							clpmTransaccionFourth.setVaCantidad(cantidad);
							clpmTransaccionFourth.setClpbAlmacen(clpbAlmacenDestino);
							clpmTransaccionFourth.setClpmCatalogo(clpmCatalogoDestino);
							clpmTransaccionFourth.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionFourth.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionFourth.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionFourth);
							////////////////////////////////////////////////////////////
							
							//Actualizando stock almacen origen
							Map mapOrigen = (HashMap)mapMaestro.get(
							coAlmacenOrigen+"-"+coCatalogoOrigen
							+"-"+coArticulo+"-"+coPremioOrigen);
							
							String strCantidadOrigen 	= String.valueOf(mapOrigen.get("va_cantidad"));
							String strStockCatOrigen 	= String.valueOf(mapOrigen.get("va_stock_catalogo"));
							String strStockCatEspOrigen = String.valueOf(mapOrigen.get("va_stock_catalogo_espejo"));
							
							Long cantidadOrigen    = new Long(strCantidadOrigen);
							Long stockCatOrigen    = new Long(strStockCatOrigen);
							Long stockCatEspOrigen = new Long(strStockCatEspOrigen);
							
							cantidadOrigen 	  = cantidadOrigen    - cantidad.longValue();
							stockCatOrigen 	  = stockCatOrigen    - cantidad.longValue();
							stockCatEspOrigen = stockCatEspOrigen - cantidad.longValue();
							
							mapOrigen.put("va_cantidad", cantidadOrigen);
							mapOrigen.put("va_stock_catalogo", stockCatOrigen);
							mapOrigen.put("va_stock_catalogo_espejo", stockCatEspOrigen);
							
							mapMaestro.put(coAlmacenOrigen+"-"+coCatalogoOrigen+"-"+
							coArticulo+"-"+coPremioOrigen, mapOrigen);
							
							StringBuffer query = new StringBuffer();
							query.append(" update clpm_stock_almacen_catalogo csa ");
							query.append(" set ");
							query.append(" 		csa.va_cantidad = ").append(cantidadOrigen).append(",");
							query.append(" 		csa.va_stock_catalogo = ").append(stockCatOrigen).append(",");
							query.append(" 		csa.va_stock_catalogo_espejo = ").append(stockCatEspOrigen).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where csa.co_catalogo = ").append(coCatalogoOrigen);
							query.append(" 	and csa.co_almacen  = ").append(coAlmacenOrigen);
							query.append("  and csa.co_articulo = ").append(coArticulo);
							query.append(" 	and csa.co_premio   = ").append(coPremioOrigen);
							query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
							jdbcTemplate.update(query.toString());
							//////////////////////////////////////
							
							//solo si son distintos
							if(!String.valueOf(coCatalogoOrigen).equals(String.valueOf(coCatalogoDestino)) || 
							   !String.valueOf(coPremioOrigen).equals(String.valueOf(coPremioDestino))){
								
								//Actualizando premio Origen
								Map mapPremioOrigen = (HashMap)mapPremio.get(
								coPremioOrigen+"-"+coArticulo+"-"+coCatalogoOrigen);
								
								String strStockCatPremOrigen 	= String.valueOf(mapPremioOrigen.get("va_stock_catalogo_premio"));
								String strStockCatPremEspOrigen = String.valueOf(mapPremioOrigen.get("va_stock_catalogo_espejo_prem"));
								
								Long stockCatPremOrigen    = new Long(strStockCatPremOrigen);
								Long stockCatPremEspOrigen = new Long(strStockCatPremEspOrigen);
								
								stockCatPremOrigen 	  = stockCatPremOrigen    - cantidad.longValue();
								stockCatPremEspOrigen = stockCatPremEspOrigen - cantidad.longValue();
								
								mapPremioOrigen.put("va_stock_catalogo_premio", stockCatPremOrigen);
								mapPremioOrigen.put("va_stock_catalogo_espejo_prem", stockCatPremEspOrigen);
								
								mapPremio.put(coPremioOrigen+"-"+coArticulo
								+"-"+coCatalogoOrigen, mapPremioOrigen);
								
								query = new StringBuffer();
								query.append(" update clpr_premio_catalogo prc ");
								query.append(" set ");
								query.append(" 		prc.va_stock_catalogo = ").append(stockCatPremOrigen).append(",");
								query.append(" 		prc.va_stock_catalogo_espejo = ").append(stockCatPremEspOrigen).append(",");
								query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
								query.append(" 		da_fecha_modificacion  = sysdate");
								query.append(" where prc.co_catalogo = ").append(coCatalogoOrigen);
								query.append("  and prc.co_premio = ").append(coArticulo);
								query.append(" 	and prc.id   = ").append(coPremioOrigen);
								query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								
								jdbcTemplate.update(query.toString());								
							}
														
							//////////////////////////////////////
							
							//Actualizando stock almacen destino
							Map mapDestino = (HashMap)mapMaestro.get(coAlmacenDestino+"-"+
							coCatalogoDestino+"-"+coArticulo+"-"+coPremioDestino);
							
							String strCantidadDestino    = String.valueOf(mapDestino.get("va_cantidad"));
							String strStockCatDestino 	 = String.valueOf(mapDestino.get("va_stock_catalogo"));
							String strStockCatEspDestino = String.valueOf(mapDestino.get("va_stock_catalogo_espejo"));
							
							int rows = 0;
							if(!strCantidadDestino.equals("null")){
								
								Long cantidadDestino = new Long(strCantidadDestino);						
								cantidadDestino = cantidadDestino + cantidad.longValue();
								
								Long stockCatDestino = new Long(strStockCatDestino);						
								stockCatDestino = stockCatDestino + cantidad.longValue();
								
								Long stockCatEspDestino = new Long(strStockCatEspDestino);						
								stockCatEspDestino = stockCatEspDestino + cantidad.longValue();
								
								query = new StringBuffer();
								query.append(" update clpm_stock_almacen_catalogo csa ");
								query.append(" set ");
								query.append(" 		csa.va_cantidad = ").append(cantidadDestino).append(",");
								query.append(" 		csa.va_stock_catalogo = ").append(stockCatDestino).append(",");
								query.append(" 		csa.va_stock_catalogo_espejo = ").append(stockCatEspDestino).append(",");
								query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
								query.append(" 		da_fecha_modificacion  = sysdate");
								query.append(" where csa.co_catalogo = ").append(coCatalogoDestino);
								query.append(" 	and csa.co_almacen  = ").append(coAlmacenDestino);
								query.append("  and csa.co_articulo = ").append(coArticulo);
								query.append(" 	and csa.co_premio   = ").append(coPremioDestino);
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								rows = jdbcTemplate.update(query.toString());
							}
							
							if(rows == 0){
								
								String strCantAlmacenada = String.valueOf(mapGost.get(
								coAlmacenDestino+"-"+clpmCatalogoDestino.getId()
								+"-"+coArticulo +"-"+clprPremioDestino.getId()));
								
								if(strCantAlmacenada.equals("null")){
									mapGost.put(coAlmacenDestino+"-"+clpmCatalogoDestino.getId()
									+"-"+coArticulo +"-"+clprPremioDestino.getId(),cantidad.longValue());
								}else{
									
									Long cantAlmacenada = new Long(strCantAlmacenada);
									cantAlmacenada = cantAlmacenada + cantidad.longValue();
									
									mapGost.put(coAlmacenDestino+"-"+clpmCatalogoDestino.getId()
									+"-"+coArticulo +"-"+clprPremioDestino.getId(),cantAlmacenada);
								}
							}
							
							//solo si son distintos
							if(!String.valueOf(coCatalogoOrigen).equals(String.valueOf(coCatalogoDestino)) || 
							   !String.valueOf(coPremioOrigen).equals(String.valueOf(coPremioDestino))){
							
								//Actualizando premio Destino
								Map mapPremioDestino = (HashMap)mapPremio.get(
								coPremioDestino+"-"+coArticulo+"-"+coCatalogoDestino);
								
								String strStockCatPremDestino 	 = String.valueOf(mapPremioDestino.get("va_stock_catalogo_premio"));
								String strStockCatPremEspDestino = String.valueOf(mapPremioDestino.get("va_stock_catalogo_espejo_prem"));
								
								if(strStockCatPremDestino.equals("null")){
									strStockCatPremDestino = "0";
								}
								
								if(strStockCatPremEspDestino.equals("null")){
									strStockCatPremEspDestino = "0";
								}
								
								Long stockCatPremDestino    = new Long(strStockCatPremDestino);
								Long stockCatPremEspDestino = new Long(strStockCatPremEspDestino);
								
								stockCatPremDestino    = stockCatPremDestino    + cantidad.longValue();
								stockCatPremEspDestino = stockCatPremEspDestino + cantidad.longValue();
								
								mapPremioDestino.put("va_stock_catalogo_premio", stockCatPremDestino);
								mapPremioDestino.put("va_stock_catalogo_espejo_prem", stockCatPremEspDestino);
								
								mapPremio.put(coPremioDestino+"-"+coArticulo
								+"-"+coCatalogoDestino, mapPremioDestino);
								
								query = new StringBuffer();
								query.append(" update clpr_premio_catalogo prc ");
								query.append(" set ");
								query.append(" 		prc.va_stock_catalogo = ").append(stockCatPremDestino).append(",");
								query.append(" 		prc.va_stock_catalogo_espejo = ").append(stockCatPremEspDestino).append(",");
								query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
								query.append(" 		da_fecha_modificacion  = sysdate");
								query.append(" where prc.co_catalogo = ").append(coCatalogoDestino);
								query.append("  and prc.co_premio = ").append(coArticulo);
								query.append(" 	and prc.id   = ").append(coPremioDestino);
								query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								jdbcTemplate.update(query.toString());							
								//////////////////////////////////////
							}
						
						/******************************
						 * Asignacion stock a catalogo
						 * ****************************/	
							
						}else if(coCatalogoOrigen == null && coCatalogoDestino != null){
						
							String stIndicadorTipoMovimiento = "";
							String stNoManejaStock = beandetalle.getStNoManejaStockFlag();
							if(stNoManejaStock.equals(CLPConstantes.ST_VERDADERO)){
								stIndicadorTipoMovimiento = CLPConstantes.ASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK;
							}else{
								stIndicadorTipoMovimiento = CLPConstantes.ASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_MANEJA_STOCK;
							}
							
							ClpmCatalogo clpmCatalogoDestino = new ClpmCatalogo();
							clpmCatalogoDestino.setId(coCatalogoDestino);
							
							//Origen
							ClpmTransaccionArticulo clpmTransaccionOrigen = new ClpmTransaccionArticulo();
							clpmTransaccionOrigen.setClpdArticulo(clpdArticulo);
							clpmTransaccionOrigen.setCoCodigoArticulo(beandetalle.getCoCodigoArticulo());
							clpmTransaccionOrigen.setStIndicadorTipoMovimiento(stIndicadorTipoMovimiento);
							
							clpmTransaccionOrigen.setVaCantidad(cantidad.negate());
							clpmTransaccionOrigen.setClpbAlmacen(clpbAlmacenOrigen);
							clpmTransaccionOrigen.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionOrigen.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionOrigen.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionOrigen);
							
							//Destino
							ClpmTransaccionArticulo clpmTransaccionDestino = new ClpmTransaccionArticulo();
							clpmTransaccionDestino.setClpdArticulo(clpdArticulo);
							clpmTransaccionDestino.setClprPremio(clprPremioDestino);
							clpmTransaccionDestino.setCoCodigoArticulo(beandetalle.getCoCodigoFlag());
							clpmTransaccionDestino.setCoCodigoPremio(beandetalle.getDePremioDestino());
							clpmTransaccionDestino.setStIndicadorTipoMovimiento(stIndicadorTipoMovimiento);
							
							clpmTransaccionDestino.setVaCantidad(cantidad);
							clpmTransaccionDestino.setClpbAlmacen(clpbAlmacenDestino);
							clpmTransaccionDestino.setClpmCatalogo(clpmCatalogoDestino);
							clpmTransaccionDestino.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionDestino.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionDestino.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionDestino);
							////////////////////////////////////////////////////////////
							
							//Actualizando stock almacen origen
							StringBuffer query = new StringBuffer();							
							String strCantidadOrigen = String.valueOf(mapMaestro.
							get(coAlmacenOrigen+"-"+coArticulo));
							
							Long cantidadOrigen = new Long(strCantidadOrigen);							
							cantidadOrigen = cantidadOrigen - cantidad.longValue();							
							mapMaestro.put(coAlmacenOrigen+"-"+coArticulo, cantidadOrigen);
							
							query = new StringBuffer();
							query.append(" update clpm_stock_almacen_catalogo csa ");
							query.append(" set ");
							query.append(" 		csa.va_cantidad = ").append(cantidadOrigen).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where csa.co_almacen = ").append(coAlmacenOrigen);
							query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
							query.append("  and csa.co_articulo = '").append(coArticulo).append("'");
							query.append("  and csa.co_catalogo is null and csa.co_premio is null");							
							jdbcTemplate.update(query.toString());
							//////////////////////////////////////
							
							//Actualizando el articulo origen
							String strStockDisponible = String.valueOf(mapArticulo.get(coArticulo));							
							Long stockDisponible = new Long(strStockDisponible);						
							stockDisponible = stockDisponible - cantidad.longValue();							
							mapArticulo.put(coArticulo, stockDisponible);
							
							query = new StringBuffer();
							query.append(" update clpd_articulo art ");
							query.append(" set ");
							query.append(" 		art.va_stock_disponible = ").append(stockDisponible).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where art.id = ").append(coArticulo);
							jdbcTemplate.update(query.toString());
							//////////////////////////////////////
							
							//Actualizando stock almacen destino
							Map mapDestino = (HashMap)mapMaestro.get(coAlmacenDestino+"-"+
							coCatalogoDestino+"-"+coArticulo+"-"+coPremioDestino);
							
							String strCantidadDestino    = String.valueOf(mapDestino.get("va_cantidad"));
							String strStockCatDestino 	 = String.valueOf(mapDestino.get("va_stock_catalogo"));
							String strStockCatEspDestino = String.valueOf(mapDestino.get("va_stock_catalogo_espejo"));
							
							int rows = 0;
							if(!strCantidadDestino.equals("null")){
								
								Long cantidadDestino = new Long(strCantidadDestino);						
								cantidadDestino = cantidadDestino + cantidad.longValue();
								
								Long stockCatDestino = new Long(strStockCatDestino);						
								stockCatDestino = stockCatDestino + cantidad.longValue();
								
								Long stockCatEspDestino = new Long(strStockCatEspDestino);						
								stockCatEspDestino = stockCatEspDestino + cantidad.longValue();
								
								query = new StringBuffer();
								query.append(" update clpm_stock_almacen_catalogo csa ");
								query.append(" set ");
								query.append(" 		csa.va_cantidad = ").append(cantidadDestino).append(",");
								query.append(" 		csa.va_stock_catalogo = ").append(stockCatDestino).append(",");
								query.append(" 		csa.va_stock_catalogo_espejo = ").append(stockCatEspDestino).append(",");
								query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
								query.append(" 		da_fecha_modificacion  = sysdate");
								query.append(" where csa.co_catalogo = ").append(coCatalogoDestino);
								query.append(" 	and csa.co_almacen  = ").append(coAlmacenDestino);
								query.append("  and csa.co_articulo = ").append(coArticulo);
								query.append(" 	and csa.co_premio   = ").append(coPremioDestino);
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								rows = jdbcTemplate.update(query.toString());
							}
							
							if(rows == 0){
								
								String strCantAlmacenada = String.valueOf(mapGost.get(
								coAlmacenDestino+"-"+clpmCatalogoDestino.getId()
								+"-"+coArticulo +"-"+clprPremioDestino.getId()));
								
								if(strCantAlmacenada.equals("null")){
									mapGost.put(coAlmacenDestino+"-"+clpmCatalogoDestino.getId()
									+"-"+coArticulo +"-"+clprPremioDestino.getId(),cantidad.longValue());
								}else{
									
									Long cantAlmacenada = new Long(strCantAlmacenada);
									cantAlmacenada = cantAlmacenada + cantidad.longValue();
									
									mapGost.put(coAlmacenDestino+"-"+clpmCatalogoDestino.getId()
									+"-"+coArticulo +"-"+clprPremioDestino.getId(),cantAlmacenada);
								}
							}
							
							//Actualizando premio Destino
							Map mapPremioDestino = (HashMap)mapPremio.get(
							coPremioDestino+"-"+coArticulo+"-"+coCatalogoDestino);
							
							String strStockCatPremDestino 	 = String.valueOf(mapPremioDestino.get("va_stock_catalogo_premio"));
							String strStockCatPremEspDestino = String.valueOf(mapPremioDestino.get("va_stock_catalogo_espejo_prem"));
							
							if(strStockCatPremDestino.equals("null")){
								strStockCatPremDestino = "0";
							}
							
							if(strStockCatPremEspDestino.equals("null")){
								strStockCatPremEspDestino = "0";
							}
							
							Long stockCatPremDestino    = new Long(strStockCatPremDestino);
							Long stockCatPremEspDestino = new Long(strStockCatPremEspDestino);
							
							stockCatPremDestino    = stockCatPremDestino    + cantidad.longValue();
							stockCatPremEspDestino = stockCatPremEspDestino + cantidad.longValue();
							
							mapPremioDestino.put("va_stock_catalogo_premio", stockCatPremDestino);
							mapPremioDestino.put("va_stock_catalogo_espejo_prem", stockCatPremEspDestino);
							
							mapPremio.put(coPremioDestino+"-"+coArticulo
							+"-"+coCatalogoDestino, mapPremioDestino);
							
							query = new StringBuffer();
							query.append(" update clpr_premio_catalogo prc ");
							query.append(" set ");
							query.append(" 		prc.va_stock_catalogo = ").append(stockCatPremDestino).append(",");
							query.append(" 		prc.va_stock_catalogo_espejo = ").append(stockCatPremEspDestino).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where prc.co_catalogo = ").append(coCatalogoDestino);
							query.append("  and prc.co_premio = ").append(coArticulo);
							query.append(" 	and prc.id   = ").append(coPremioDestino);
							query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
							jdbcTemplate.update(query.toString());							
							//////////////////////////////////////
							
							
						/********************************
						 * Desasignacion stock a catalogo
						 * ******************************/	
						
						}else if(coCatalogoOrigen != null && coCatalogoDestino == null){
							
							String stIndicadorTipoMovimiento = "";
							String stNoManejaStock = beandetalle.getStNoManejaStockFlag();
							if(stNoManejaStock.equals(CLPConstantes.ST_VERDADERO)){
								stIndicadorTipoMovimiento = CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_NO_MANEJA_STOCK;
							}else{
								stIndicadorTipoMovimiento = CLPConstantes.DESASIGNACION_STOCK_A_CATALOGO_DE_ARTICULO_QUE_MANEJA_STOCK;
							}
							
							Long coPremioOrigen = new Long(beandetalle.getCoPremio());
							ClpmCatalogo clpmCatalogoOrigen = new ClpmCatalogo();
							clpmCatalogoOrigen.setId(coCatalogoOrigen);
							
							//Origen
							ClpmTransaccionArticulo clpmTransaccionOrigen = new ClpmTransaccionArticulo();
							clpmTransaccionOrigen.setClpdArticulo(clpdArticulo);
							clpmTransaccionOrigen.setClprPremio(clprPremio);
							clpmTransaccionOrigen.setCoCodigoArticulo(beandetalle.getCoCodigoFlag());
							clpmTransaccionOrigen.setCoCodigoPremio(beandetalle.getCoCodigoArticulo());
							clpmTransaccionOrigen.setStIndicadorTipoMovimiento(stIndicadorTipoMovimiento);
							
							clpmTransaccionOrigen.setVaCantidad(cantidad.negate());
							clpmTransaccionOrigen.setClpbAlmacen(clpbAlmacenOrigen);
							clpmTransaccionOrigen.setClpmCatalogo(clpmCatalogoOrigen);
							clpmTransaccionOrigen.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionOrigen.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionOrigen.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionOrigen);
							
							//Destino
							ClpmTransaccionArticulo clpmTransaccionDestino = new ClpmTransaccionArticulo();
							clpmTransaccionDestino.setClpdArticulo(clpdArticulo);
							clpmTransaccionDestino.setCoCodigoArticulo(beandetalle.getCoCodigoArticulo());
							clpmTransaccionDestino.setStIndicadorTipoMovimiento(stIndicadorTipoMovimiento);
							
							clpmTransaccionDestino.setVaCantidad(cantidad);
							clpmTransaccionDestino.setClpbAlmacen(clpbAlmacenDestino);
							clpmTransaccionDestino.setClpbDocumentoMovArticulo(objBean);
							clpmTransaccionDestino.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
							clpmTransaccionDestino.setDaFechaCreacion(Calendar.getInstance());
							getHibernateTemplate().saveOrUpdate(clpmTransaccionDestino);
							////////////////////////////////////////////////////////////
							
							//Actualizando stock almacen origen
							Map mapOrigen = (HashMap)mapMaestro.get(
							coAlmacenOrigen+"-"+coCatalogoOrigen
							+"-"+coArticulo+"-"+coPremioOrigen);
							
							String strCantidadOrigen 	= String.valueOf(mapOrigen.get("va_cantidad"));
							String strStockCatOrigen 	= String.valueOf(mapOrigen.get("va_stock_catalogo"));
							String strStockCatEspOrigen = String.valueOf(mapOrigen.get("va_stock_catalogo_espejo"));
							
							Long cantidadOrigen    = new Long(strCantidadOrigen);
							Long stockCatOrigen    = new Long(strStockCatOrigen);
							Long stockCatEspOrigen = new Long(strStockCatEspOrigen);
							
							cantidadOrigen 	  = cantidadOrigen    - cantidad.longValue();
							stockCatOrigen 	  = stockCatOrigen    - cantidad.longValue();
							stockCatEspOrigen = stockCatEspOrigen - cantidad.longValue();
							
							mapOrigen.put("va_cantidad", cantidadOrigen);
							mapOrigen.put("va_stock_catalogo", stockCatOrigen);
							mapOrigen.put("va_stock_catalogo_espejo", stockCatEspOrigen);
							
							mapMaestro.put(coAlmacenOrigen+"-"+coCatalogoOrigen+"-"+
							coArticulo+"-"+coPremioOrigen, mapOrigen);
							
							StringBuffer query = new StringBuffer();
							query.append(" update clpm_stock_almacen_catalogo csa ");
							query.append(" set ");
							query.append(" 		csa.va_cantidad = ").append(cantidadOrigen).append(",");
							query.append(" 		csa.va_stock_catalogo = ").append(stockCatOrigen).append(",");
							query.append(" 		csa.va_stock_catalogo_espejo = ").append(stockCatEspOrigen).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where csa.co_catalogo = ").append(coCatalogoOrigen);
							query.append(" 	and csa.co_almacen  = ").append(coAlmacenOrigen);
							query.append("  and csa.co_articulo = ").append(coArticulo);
							query.append(" 	and csa.co_premio   = ").append(coPremioOrigen);
							query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
							jdbcTemplate.update(query.toString());
							//////////////////////////////////////
							
							//Actualizando premio Origen
							Map mapPremioOrigen = (HashMap)mapPremio.get(
							coPremioOrigen+"-"+coArticulo+"-"+coCatalogoOrigen);
							
							String strStockCatPremOrigen 	= String.valueOf(mapPremioOrigen.get("va_stock_catalogo_premio"));
							String strStockCatPremEspOrigen = String.valueOf(mapPremioOrigen.get("va_stock_catalogo_espejo_prem"));
							
							Long stockCatPremOrigen    = new Long(strStockCatPremOrigen);
							Long stockCatPremEspOrigen = new Long(strStockCatPremEspOrigen);
							
							stockCatPremOrigen 	  = stockCatPremOrigen    - cantidad.longValue();
							stockCatPremEspOrigen = stockCatPremEspOrigen - cantidad.longValue();
							
							mapPremioOrigen.put("va_stock_catalogo_premio", stockCatPremOrigen);
							mapPremioOrigen.put("va_stock_catalogo_espejo_prem", stockCatPremEspOrigen);
							
							mapPremio.put(coPremioOrigen+"-"+coArticulo
							+"-"+coCatalogoOrigen, mapPremioOrigen);
							
							query = new StringBuffer();
							query.append(" update clpr_premio_catalogo prc ");
							query.append(" set ");
							query.append(" 		prc.va_stock_catalogo = ").append(stockCatPremOrigen).append(",");
							query.append(" 		prc.va_stock_catalogo_espejo = ").append(stockCatPremEspOrigen).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where prc.co_catalogo = ").append(coCatalogoOrigen);
							query.append("  and prc.co_premio = ").append(coArticulo);
							query.append(" 	and prc.id   = ").append(coPremioOrigen);
							query.append(" 	and prc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
							jdbcTemplate.update(query.toString());							
							//////////////////////////////////////
							
							//Actualizando el articulo destino
							String strStockDisponible = String.valueOf(mapArticulo.get(coArticulo));							
							Long stockDisponible = new Long(strStockDisponible);						
							stockDisponible = stockDisponible + cantidad.longValue();							
							mapArticulo.put(coArticulo, stockDisponible);
							
							query = new StringBuffer();
							query.append(" update clpd_articulo art ");
							query.append(" set ");
							query.append(" 		art.va_stock_disponible = ").append(stockDisponible).append(",");
							query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
							query.append(" 		da_fecha_modificacion  = sysdate");
							query.append(" where art.id = ").append(coArticulo);
							jdbcTemplate.update(query.toString());
							//////////////////////////////////////
							
							//Actualizando stock almacen destino
							String strCantidadDestino = String.valueOf(mapMaestro.
							get(coAlmacenDestino+"-"+coArticulo));
							
							int rows = 0;
							if(!strCantidadDestino.equals("null")){
								
								Long cantidadDestino = new Long(strCantidadDestino);						
								cantidadDestino = cantidadDestino + cantidad.longValue();
								
								query = new StringBuffer();
								query.append(" update clpm_stock_almacen_catalogo csa ");
								query.append(" set ");
								query.append(" 		csa.va_cantidad = ").append(cantidadDestino).append(",");
								query.append(" 		co_usuario_modificador = '").append(getUsuarioLogueado().getUsername()).append("',");
								query.append(" 		da_fecha_modificacion  = sysdate");
								query.append(" where csa.co_almacen = ").append(coAlmacenDestino);
								query.append(" 	and csa.st_stock_almacen_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
								query.append("  and csa.co_articulo = '").append(coArticulo).append("'");
								query.append("  and csa.co_catalogo is null and csa.co_premio is null");							
								rows = jdbcTemplate.update(query.toString());
							}
							
							if(rows == 0){
								
								String strCantAlmacenada = String.valueOf(mapGost.get(
								coAlmacenDestino+"-"+coArticulo));
								
								if(strCantAlmacenada.equals("null")){
									mapGost.put(coAlmacenDestino+"-"+
									coArticulo,cantidad.longValue());
								}else{
									
									Long cantAlmacenada = new Long(strCantAlmacenada);
									cantAlmacenada = cantAlmacenada + cantidad.longValue();
									
									mapGost.put(coAlmacenDestino+"-"+
									coArticulo,cantAlmacenada);
								}							
							}
						}
					}
				}
			}
			
			/**
			* @author	   : frk
			* @description : Insertando en stock almacen catalogo 
			* los destinos que no existen
			**/
			
			Set<String> setGost  = mapGost.keySet();
			Iterator<String> itr = setGost.iterator();
			
		    while (itr.hasNext()) {
		      
		    	String strKey     = itr.next();
		    	String[] arrayKey = strKey.split("-");
		    	Long cantidadAcum = new Long(mapGost.get(strKey).toString());
		    	
		    	if(arrayKey.length == 2){
		    		
		    		Long coAlmacenDestino = new Long(arrayKey[0]);
		    		ClpbAlmacen clpbAlmacenDestino = new ClpbAlmacen();
					clpbAlmacenDestino.setId(coAlmacenDestino);
		    		
					Long coArticulo = new Long(arrayKey[1]);					
					ClpdArticulo clpdArticulo = new ClpdArticulo();
					clpdArticulo.setId(coArticulo);
					
		    		ClpmStockAlmacenCatalogo clpmStockAlmacenCatalogo = new ClpmStockAlmacenCatalogo();
					clpmStockAlmacenCatalogo.setClpdArticulo(clpdArticulo);
					clpmStockAlmacenCatalogo.setClpbAlmacen(clpbAlmacenDestino);
					clpmStockAlmacenCatalogo.setVaCantidad(new BigDecimal(cantidadAcum));
					clpmStockAlmacenCatalogo.setStStockAlmacenCatalogo(true);
					clpmStockAlmacenCatalogo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					clpmStockAlmacenCatalogo.setDaFechaCreacion(Calendar.getInstance());
					getHibernateTemplate().saveOrUpdate(clpmStockAlmacenCatalogo);
		    		
		    	}else{
		    		
		    		Long coAlmacenDestino = new Long(arrayKey[0]);
		    		ClpbAlmacen clpbAlmacenDestino = new ClpbAlmacen();
					clpbAlmacenDestino.setId(coAlmacenDestino);
		    		
					Long coCatalogoDestino = new Long(arrayKey[1]);
					ClpmCatalogo clpmCatalogoDestino = new ClpmCatalogo();
					clpmCatalogoDestino.setId(coCatalogoDestino);
					
					Long coArticulo = new Long(arrayKey[2]);					
					ClpdArticulo clpdArticulo = new ClpdArticulo();
					clpdArticulo.setId(coArticulo);
					
					Long coPremioDestino = new Long(arrayKey[3]);
					ClprPremioCatalogo clprPremioDestino = new ClprPremioCatalogo();
					clprPremioDestino.setId(new Long(coPremioDestino));
		    		
					ClpmStockAlmacenCatalogo clpmStockAlmacenCatalogo = new ClpmStockAlmacenCatalogo();
					clpmStockAlmacenCatalogo.setClpdArticulo(clpdArticulo);
					clpmStockAlmacenCatalogo.setClpbAlmacen(clpbAlmacenDestino);
					clpmStockAlmacenCatalogo.setClpmCatalogo(clpmCatalogoDestino);
					clpmStockAlmacenCatalogo.setClprPremioCatalogo(clprPremioDestino);
					clpmStockAlmacenCatalogo.setVaCantidad(new BigDecimal(cantidadAcum));
					clpmStockAlmacenCatalogo.setVaStockCatalogo(new BigDecimal(cantidadAcum));
					clpmStockAlmacenCatalogo.setVaStockCatalogoEspejo(new BigDecimal(cantidadAcum));
					clpmStockAlmacenCatalogo.setStStockAlmacenCatalogo(true);
					clpmStockAlmacenCatalogo.setCoUsuarioCreador(getUsuarioLogueado().getUsername());
					clpmStockAlmacenCatalogo.setDaFechaCreacion(Calendar.getInstance());
					getHibernateTemplate().saveOrUpdate(clpmStockAlmacenCatalogo);		    		
		    	}		    	
		     }
			
			///////////////////////////////
			///////////////////////////////
			getHibernateTemplate().flush();
			map.put("msg", "success");
			map.put("id" , objBean.getId());
			///////////////////////////////
			///////////////////////////////
			
		}catch(Exception e){
			
			getHibernateTemplate().clear();
			map.put("msg", "error");
			log.info(e.getMessage());
		}
		
		return (HashMap)map;
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<BNArticulo> obtenerPremiosPorArticuloNoInstantVale(
			String coAlmacenOrigen, String coCatalogoOrigen,
			String coCatalogoDestino, String coCodigoArticulo) {
		
		StringBuffer query = new StringBuffer();
		query.append(" select  ");
		query.append(" 	pc.id, ");
		query.append(" 	pc.co_codigo_premio||' - '||art.de_articulo as dePremio ");
		query.append(" from clpr_premio_catalogo pc ");
		query.append(" inner join clpd_articulo art ");
		query.append(" 	on art.id = pc.co_premio ");
		query.append(" where pc.co_catalogo = ").append(coCatalogoDestino);
		query.append(" and pc.st_premio_catalogo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and art.st_articulo = '").append(CLPConstantes.ST_VERDADERO).append("'");
		query.append(" and art.st_instantaneo_vale = '").append(CLPConstantes.ST_FALSO).append("'");
		
		if(StringUtils.isBlank(coCatalogoOrigen) || "-1".equals(coCatalogoOrigen)){
			query.append(" and art.co_codigo_articulo = '").append(coCodigoArticulo).append("'");
		}else{
			query.append(" and pc.co_codigo_premio = '").append(coCodigoArticulo).append("'");
		}
		
		System.out.println("obtenerPremiosPorArticuloNoInstantVale() -->"+query.toString());
		List list = findListOfBeans(query.toString(), null, BNArticulo.class);
		if(!list.isEmpty()){
			return list;
		}else{
			
			BNArticulo bean = new BNArticulo();
			bean.setId(new Long("-1"));
			bean.setDePremio("----");
			
			List listOther = new ArrayList();
			listOther.add(bean);
			return listOther;			
		}
	}
}
